package main

import (
	"fmt"
	"os"
	"os/exec"
	"syscall"
)

func main() {
	switch os.Args[1] {
	case "run":
		run()
	case "init":
		Init()
	default:
		//抛出错误
		panic("have not dinfined")
	}
}
func run() {
	fmt.Println("进入新的shell->")
	//执行linux的命令
	cmd := exec.Command(os.Args[0], "init", os.Args[2])
	cmd.SysProcAttr = &syscall.SysProcAttr{
		//用于在Linux中创建一个新的UTS namespace
		Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS,
	}
	//标准输入流
	cmd.Stdin = os.Stdin
	//标准输出流
	cmd.Stdout = os.Stdout
	//标准错误
	cmd.Stderr = os.Stderr
	if err := cmd.Run(); err != nil {
		panic(err)
	}
}

func Init() {
	//修改容器名
	syscall.Sethostname([]byte("container"))
	syscall.Chroot("rootfs")
	syscall.Chdir("/")
	//挂载进程
	syscall.Mount("proc", "/proc", "proc", 0, "")
	if err := syscall.Exec(os.Args[2], os.Args[2:], os.Environ()); err != nil {
		panic(err)
	}
	syscall.Unmount("/proc", 0)
}
